package com.cskaoyan.javase.oop3._1interface._4example.dao.impl;

import com.cskaoyan.javase.oop3._1interface._4example.dao.IGoodsDao;
import com.cskaoyan.javase.oop3._1interface._4example.model.Goods;
import com.cskaoyan.javase.oop3._1interface._4example.model.GoodsData;

/**
 * 用于对外提供商品数据处理的服务
 * 任何想要对商品进行数据处理的需求，都需要本类对象来完成
 * 本类对象可以直接和数据源交互
 *
 * @since 09:29
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class IGoodsDaoImpl implements IGoodsDao {

    // 依赖于数据源中的商品数组
    private Goods[] goods = GoodsData.GOODS;

    /**
     * 将装有全部商品对象的数组返回，要求过滤null元素
     *
     * @return com.cskaoyan.javase.oop3._1interface.interfacedemo.model.Goods[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/08/27 9:42
     */
    @Override
    public Goods[] getAllRealGoods() {
        // 过滤数组元素,真正删除数组元素,需要创建新数组
        // 计数器,计数原数组中null元素的个数
        int count = 0;
        for (Goods ele : goods) {
            if (ele == null) {
                count++;
            }
        }
        int newArrLength = goods.length - count;
        Goods[] result = new Goods[newArrLength];
        // 遍历老数组,过滤元素,给新数组赋值
        int newIndex = 0;
        for (Goods ele : goods) {
            if (ele == null) {
                continue;
            }
            result[newIndex] = ele;
            newIndex++;
        }
        return result;
    }

    /**
     * 校验id是否已存在于数据源中
     *      存在重复返回true
     *      否则返回false
     *
     * @param id
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/08/27 10:05
     */
    @Override
    public boolean judgeIdRepeat(int id) {
        /*for (Goods ele : goods) {
            // 判null,避免空指针异常,这是常规手段
            if (ele == null){
                continue;
            }
        }*/
        for (Goods realGoods : getAllRealGoods()) {
            // 这个数组中没有null元素
            if (realGoods.getId() == id){
                // 已经存在,重复了
                return true;
            }
        }
        // 不存在,不重复
        return false;
    }

    /**
     * 插入商品对象,要么成功返回true,要么插入失败数组满了,返回false
     *
     * @param goodsInsert
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/08/27 10:08
     */
    @Override
    public boolean createGoodsByIdNotRepeat(Goods goodsInsert) {
        // 遍历数据源数组,插入一个新的商品对象
        for (int i = 0; i < goods.length; i++) {
            // 找一个null的位置
            if (goods[i] == null){
                // 赋值,插入成功
                goods[i] = goodsInsert;
                return true;
            }
        }
        // 数组满了,没有位置了
        return false;
    }
}
